<html>
    <head>
        <title>分离主机和租户数据库</title>
    </head>
    <body>
        <script>
            /*
                        四、分离主机和租户数据库

                                在多租户解决方案中，你可能希望分离数据库模式，因此当租户拥有单独的数据库时，与主机相关的表不会位于租户数据库中。

                                一些预构建的ABP模块仅与主机端相关，
                                
                                例如租户管理模块。因此，在租户DbContext类中，你不会调用modelBuilder.ConfigureTenantManagement()仅此而已。



                                有些模块，如Identity模块，既用于主机端，也用于租户端。它将租户用户存储在租户数据库中，将主机用户存储在主机数据库中。

                                但是，它将一些实体，如IdentityClaimType，仅存储在主机端。

                                在这种情况下，你不希望在租户数据库中添加这些表，即使它们没有被使用并且对于租户来说总是为空。

                                ABP提供了一种为DbContext设置多租户端的简单方法，因此模块可以检查它并决定是否将表映射到数据库。

                                                public class MyTenantDbContext : AbpDbContext<MyTenantDbContext>
                                                {
                                                    protected override void OnModelCreating(ModelBuilder modelBuilder)
                                                    {
                                                        modelBuilder.SetMultiTenancySide(MultiTenancySides.Tenant); // 将当前DbContext 设置为租户端数据库
                                                        
                                                        base.OnModelCreating(modelBuilder);
                                                        
                                                        modelBuilder.ConfigureIdentity(); // 此模块中有租户端表，也有主机端表，只会在此数据库创建租户端表
                                                        modelBuilder.ConfigureFeatureManagement();  // 此模块所有的表都是主机端表，因此不会创建它们，即使调用此方法也不会有任何作用
                                                        modelBuilder.ConfigureAuditLogging();
                                                    }
                                                }

                                            OnModelCreating中的第一行将多租户端设置为Tenant。

                                            对于此示例，不会创建功能管理表（因为所有表都是特定于主机的），因此调用modelBuilder.ConfigureFeatureManagement()没有效果。

                                            ConfigureIdentity() 只会创建IDentity模块的租户端表。


                                           ★、etMultiTenancySide可以得到以下值：

                                                    ①、MultiTenancySides.Both（默认值）：此DbContext（以及相关数据库）由主机和租户共享、

                                                    ②、MultiTenancySides.Host：此DbContext（以及相关数据库）仅由主机端使用。

                                                    ③、MultiTenancySides.Tenant：此DbContext（以及相关数据库）仅适用于租户。




                                            如果你创建了一个可重用的应用程序模块或想要在应用程序代码中检查该值，
                                            
                                            你可以使用modelBuilder.GetMultiTenancySide()检查当前端（主机还是租户）：

                                                    var side = modelBuilder.GetMultiTenancySide();
                                                    if (!side.HasFlag(MultiTenancySides.Host))
                                                    {
                                                        ...
                                                    }
                                            或者实际上你可以使用快捷方式扩展方法之一：

                                                    if (modelBuilder.IsTenantOnlyDatabase())
                                                    {
                                                        ...
                                                    }

                                            ★、有四种方法可以检查当前侧：

                                                    ①、IsHostDatabase()：如果你应该创建与主机相关的表，则返回true。
                                                    
                                                                这相当于检查：  modelBuilder.GetMultiTenancySide().HasFlag(MultiTenancySides.Host)

                                                    ②、IsHostOnlyDatabase()：如果你应该只创建与主机相关的表，但不应该创建与租户相关的表，则返回true。
                                                    
                                                                这相当于检查modelBuilder.GetMultiTenancySide() == MultiTenancySides.Host。

                                                    ③、IsTenantDatabase()：如果你应该创建与租户相关的表，则返回true。
                                                    
                                                                这相当于检查modelBuilder.GetMultiTenancySide().HasFlag(MultiTenancySides.Tenant)。

                                                    ④、IsTenantOnlyDatabase()：如果你应该只创建与租户相关的表，但不应该创建与主机相关的表，则返回true。
                                                        
                                                                这相当于检查modelBuilder.GetMultiTenancySide() == MultiTenancySides.Tenant。

                    */
        </script>
    </body>
</html>